/**
 * @file Matrix.h
 * @brief 矩阵类 Matrix 的声明文件
 */

#include <iostream>

/**
 * @brief 矩阵类
 * 
 * 存储方式采用二维指针实现，以行优先的方式存储矩阵元素。
 * 提供基本的矩阵运算，包括矩阵加、减、数乘、乘法。
 */

template<typename _T>
class Matrix
{
 private:
  int row;
  int col;
  _T** num = nullptr;
 public:
  /**
     * @brief 构造函数
     * 构造一个空的矩阵
     */
  Matrix(){};

  /**
     * @brief 构造函数
     * 
     * 构造一个行数为 row_，列数为 col_ 的矩阵，并初始化所有元素为 0。
     * @param row_: 矩阵的行数
     * @param col_: 矩阵的列数
     */
  Matrix(const int row_,const int col_);

  /**
     * @brief 复制构造函数
     * 
     * 拷贝构造一个矩阵。
     * @param A: 要拷贝的矩阵
     */
  Matrix(const Matrix& A);
  
  /**
     * @brief 析构函数
     * 
     * 释放矩阵占用的内存。
     */
  ~Matrix(){ if ( num != nullptr ) delete [] num; }

  /**
     * @brief 拷贝赋值运算符
     * 
     * 用一个矩阵的值替换当前矩阵的值。
     * @param A: 要拷贝的矩阵
     * @return 当前矩阵的引用
     */
  Matrix& operator=(const Matrix& A);

  /**
     * @brief 输出矩阵
     * 
     * 输出当前矩阵到标准输出。
     */
  void printMatrix() const;

  /**
     * @brief 清空矩阵
     * 
     * 释放当前矩阵占用的内存，将矩阵行列数置为 0。
     */
  void makeEmpty();

  /**
     * @brief 矩阵加法
     * 
     * 将当前矩阵与另一个矩阵相加，并返回结果矩阵。
     * @param A: 另一个矩阵
     * @return 相加后的结果矩阵
     */
  Matrix add(const Matrix& A) const;

  /**
     * @brief 矩阵减法
     * 
     * 将当前矩阵与另一个矩阵相减，并返回结果矩阵。
     * @param A: 另一个矩阵
     * @return 相减后的结果矩阵
     */
  Matrix sub(const Matrix& A) const;

  /**
     * @brief 矩阵数乘
     * 
     * 将当前矩阵乘以一个标量，并返回结果矩阵。
     * @param k: 标量
     * @return 数乘后的结果矩阵
     */
  Matrix scalarMul(const _T k) const;

  /**
     * @brief 矩阵乘法
     * 
     * 将当前矩阵与另一个矩阵相乘，并返回结果矩阵。
     * @param A: 另一个矩阵
     * @return 相乘后的结果矩阵
     */
  Matrix multiply(const Matrix& A) const;

   /**
     * @brief 获取矩阵的行数
     * 
     * @return 矩阵的行数
     */
  int getrow() const;

   /**
     * @brief 获取矩阵的列数
     * 
     * @return 矩阵的列数
     */
  int getcol() const;

  /**
     * @brief 获取矩阵中特定位置的元素值
     * 
     * @param row_: 行数
     * @param col_: 列数
     * @return 元素值
     */
  _T getvalue(const int row_,const int col_ ) const;

  /**
     * @brief 设置矩阵中特定位置的元素值
     * 
     * @param val: 要设置的元素值
     * @param row_: 行数
     * @param col_: 列数
     */
  void setvalue(const _T val, const int row_,const  int vol_);
};

